iT邦幫忙

2021 iThome 鐵人賽

DAY 25
3

  今天要認識的迭代器模式我個人覺得需要多花一點心思,才能夠了解它並善用它,程式當中也算是經常使用的設計模式,現在就一起來認識它吧!


問題情境與解析

  假設現在需要維護一個通知名單的程式,而這個通知名單我們可以將它集合成一個陣列或是其他複雜的數據結構,但無論集合的結構長甚麼樣子,它都必須提供某種方式可以遍歷集合的所有元素,例如可以是針對一棵樹進行深度優先遍歷,也可以是廣度優先遍歷,抑或是隨機訪問樹的元素等等。

  然而可能會因為需求不同而需要不一樣的遍歷方法添加到集合中,這就會逐漸模糊了集合的主要職,除此之外,由於集合提供了不同遍歷元素的方法,因此客戶端的程式就需要與特定的集合類別耦合。

  若使用Iterator Pattern,就會將集合的遍歷行為封裝到一個迭代器的類別中,有多少種遍歷方式就有多少個迭代器類別,並且實做相同的介面。而多個迭代器還可以同時遍歷同一個集合,彼此獨立開來,如果需要一種特殊方法來遍歷集合的話,只需要創建一個新的迭代器類別,就不用去更改集合或是客戶端的程式。

Class Diagram

https://ithelp.ithome.com.tw/upload/images/20211010/20140743iQwOmnhdCD.png

Skeleton Code

interface Iterator {
    public boolean hasNext();
    public Object getNext();
}

class ConcreteIterator implements Iterator {
    private Object[] collection;
    private int iteratorIndex = 0;
    
    public ConcreteIterator(Object[] c) {
        collection = c;
    }
    
    public boolean hasNext() {
        // Check the iterator has the next one
    }
    
    public Object getNext() {
        // Get the next object
    }
}

interface Collection {
    public Iterator createIterator();
}

class ConcreteCollection implements Collection {
    Object[] collection;
    
    public Iterator createIterator() {
        return new ConcreteIterator(collection);
    }
}

  若是碰到有集合是屬於複雜的數據結構,想要對客戶端隱藏其複雜性時,就可以使用迭代器模式來完成,透過適當的迭代器來處理客戶端的需求以及集合的元素,有需要的話也能夠並行迭代同一個集合,因為每個迭代器物件都有自己的狀態,彼此互不影響,而且也實現了開放/封閉原則,新增新的類別也不影響原本的程式,雖然好處多多,但還是要看場合,若是一個簡單的集合,使用迭代器也許就有點矯枉過正了。


除此之外,也歡迎大家走走逛逛關於我們團隊夥伴的文章

lu23770127 - SASS 基礎初學三十天

10u1 - 糟了!是世界奇觀!

juck30808 - Python - 數位行銷分析與 Youtube API 教學

SiQing47 - 前端?後端?你早晚都要全端的,何不從現在開始?


上一篇
IT鐵人DAY 24-Chain of Responsibility 責任鏈模式
下一篇
IT鐵人DAY 26-Memento 備忘錄模式
系列文
淺談物件導向與Design Pattern介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
juck30808
iT邦研究生 1 級 ‧ 2021-10-10 21:59:51

終於要結束了!!!

我要留言

立即登入留言